// clase principal
( function($) {
    $.Brafh = function() {};
} (jQuery) );

// panel de busqueda
( function($) {
    $.Brafh.Search = function() {
        this.search_panel   = $('#search .field');
        this.search_results = $('#search .search-results');
    };

    $.Brafh.Search.prototype = {
        Start : function() {
            var self = this;

            if( this.search_panel.size() ) {
                this.search_panel.bind( 'keyup', function() {
                    self.Search();
                });

                this.search_panel.focus( function() {
                    console.log( 'size: '+$('.group', this.search_results).size() );
                    if( $('.group', this.search_results).size() > 0 ) self.search_results.show();
                });

                this.search_panel.focusout( function() {
                    self.search_results.fadeOut('slow');
                });

                // FIXME
                // this.search_panel.bind( 'lostfocus', function() {
                //     console.log( 'test' );
                // });
            }
        },

        Search : function() {
            var self = this;

            $.ajax({
                url   : 'ajax/search.php',
                type  : 'POST',
                data  : { token : self.search_panel.val().trim() },
                async : false
            }).done( function(response) {
                console.log( response );
                if( response != 0 ) self.RenderResults( $.parseJSON(response) );
            }).fail( function(response) {
                console.log( 'todo reeee mal :(');
            });
        },

        RenderResults : function( collection ) {
            $( '*', this.search_results ).remove();
            if( collection.productos && (collection.productos.length > 0) ) {
                var productos = $('<li></li>');
                productos.append('<li class="group">Productos</li>');
                var ul = $('<ul class="group-results"></ul>');
                $.each( collection.productos, function(i, item) {
                    ul.append('<li><a href="#" class="result">' + item.nombre  + '</a></li>');
                });
                productos.append( ul );
                this.search_results.append( productos );
                this.search_results.show();
            }
        }
    };
} (jQuery) );

// catalogo de productos
( function($) {
    $.Brafh.Catalogo = function(args) {
        this.args = args;

        this.catalogo = {
            container : $('#catalogo')
        };

        this.productos = {
            container : $( '.productos', this.catalogo.container )
        };

        this.paginador = {
            container    : $( '.paginador', this.catalogo.container ),
            page_size    : 9,
            current_page : 1,
            total_pages  : 0
        };

        this.muestra = {
            container : $('#muestra')
        };
    };

    $.Brafh.Catalogo.prototype = {
        Start : function() {
            $.Brafh();

            var self       = this;
            var collection = $.parseJSON( self.args.data );

            if( collection.length == 0 ) return;

            $.each( collection, function(i, item) {
                self.productos.container.append( self.ProductToHTML(item) );
            });

            this.CreatePager();
        },

        ProductToHTML : function( data ) {
            var self = this;

            var item = $('<div class="item"></div>');
            item.append( $('<img src="img/productos/' + data.imagen + '" alt="' + data.nombre + '" class="imagen">') );
            item.append( $('<span class="nombre">' + data.nombre + '</span>') );
            var link = $('<a href="#" data-product="' + data.id + '">');
            link.append( $('<span>Ver producto</span>') );
            link.append( $('<img src="img/productos/vermas.png" alt="Ver producto">') );
            var vermas = $('<div class="vermas"></div>');
            vermas.append( link );
            item.append( vermas );
            var inner = $('<div class="inner"></div>');
            inner.append( item );
            var li = $('<li></li>');
            li.append( inner );

            link.bind( 'click', function(e) {
                e.preventDefault();
                var id = $( e.target ).parent('a').attr('data-product');
                self.CreateProductView( self.GetProductData(id) );
            });

            return li;
        },

        CreatePager : function() {
            var self = this;
            
            this.paginador.total_pages = Math.ceil( this.productos.container.children('li').size() / this.paginador.page_size );

            if( this.paginador.total_pages > 1 ) {
                this.paginador.container.append('<li><span data-page="anterior">&lt; anterior</span></li>');
                for( var i = 0; i < this.paginador.total_pages; i++ ) {
                    this.paginador.container.append( $('<li><span data-page="' + (i + 1) + '">' + (i + 1) + '</span></li>') );
                }
                this.paginador.container.append('<li><span data-page="siguiente">siguente &gt;</span></li>');
            }

            $( 'span', this.paginador.container ).bind( 'click', function(e) {
                self.SetPage( $( e.target ).attr('data-page'), true );
            });

            this.SetPage( 1, false );
        },

        SetPage : function( page, show_effects ) {
            var self = this;

            if( page <= 0 )                              this.paginador.current_page = 1;
            else if( page == 'anterior' )                this.paginador.current_page--;
            else if( page == 'siguiente' )               this.paginador.current_page++;
            else if( page > this.paginador.total_pages ) this.paginador.current_page = total_pages;
            else                                         this.paginador.current_page = page;

            if( this.paginador.current_page == 1 ) {
                $('li span[data-page="anterior"]', this.paginador.container ).hide();
                $('li span[data-page="siguiente"]', this.paginador.container ).show();
            } else if( this.paginador.current_page == this.paginador.total_pages ) {
                $('li span[data-page="anterior"]', this.paginador.container ).show();
                $('li span[data-page="siguiente"]', this.paginador.container ).hide();
            } else {
                $('li span[data-page="anterior"]', this.paginador.container ).show();
                $('li span[data-page="siguiente"]', this.paginador.container ).show();
            }

            $( 'span', this.paginador.container ).removeClass('active');
            $( 'span[data-page="' + this.paginador.current_page + '"]', this.paginador.container ).addClass('active');

            var lower_bound = ( self.paginador.current_page - 1 ) * self.paginador.page_size;
            var upper_bound = ( self.paginador.current_page - 1 ) * self.paginador.page_size + self.paginador.page_size;
            if( show_effects ) {
                $( 'li', this.productos.container ).fadeOut('slow').promise().done( function() {
                    $( 'li', self.productos.container ).slice(lower_bound, upper_bound).fadeIn('slow');
                });
            } else {
                $( 'li', this.productos.container ).hide();
                $( 'li', this.productos.container ).slice(lower_bound, upper_bound).show();
            }
        },

        CreateProductView : function( data ) {
            var self = this;
            var items = $( 'li', this.productos.container );

            $( '.titulo .nombre', this.muestra.container ).html( data.product.nombre );
            $( '.titulo .energia', this.muestra.container ).html( '|' + data.product.energia );
            $( '.descripcion .thumb img', this.muestra.container ).attr('src', 'img/productos/' + data.product.imagen );
            $( '.descripcion .thumb img', this.muestra.container ).attr('alt', data.product.nombre );
            var lis = '';
            $.each( data.product.caracteristicas, function(i, item) {
                lis += ('<li>' + item + '</li>')
            });
            $( '.caracteristicas ul', this.muestra.container ).html( lis );

            var back = $('.back');
            if( ! back.size() ) {
                back = $('<div class="back"></div>').css( 'min-height', $(document).height() );
                $('body').append( back );
            }

            var backinner     = ( ! $('.backinner').size()     ? $('<div class="backinner"></div>')     : $('.backinner') );
            var backcontainer = ( ! $('.backcontainer').size() ? $('<div class="backcontainer"></div>') : $('.backcontainer') );

            backcontainer.html( this.muestra.container );
            backinner.prepend( backcontainer );

            $('body').append( backinner );

            this.muestra.container.show();

            back.fadeIn('slow');
            backinner.fadeIn('slow');

            $('a.presupuesto').attr( 'data-product', data.product.id );
            $('a.presupuesto').bind( 'click', function(e) {
                e.preventDefault();
                self.AddToCart( data.product.id );
            });

            $( '.close img', this.muestra.container ).bind( 'click', function(e) {
                e.preventDefault();
                back.fadeOut('slow');
                backinner.fadeOut('slow').promise().done( function() {
                    backinner.remove();
                });
            });

            back.bind( 'click', function(e) {
                e.preventDefault();
                back.fadeOut('slow');
                backinner.fadeOut('slow').promise().done( function() {
                    backinner.remove();
                });
            });

            var show_left  = true;
            var show_right = true;
            var elements   = $.parseJSON( self.args.data );
            if( elements.length <= 1 ) {
                show_left  = false;
                show_right = false;
            } else {
                if( data.position == 0 )                        show_left = false;
                else if( data.position == elements.length - 1 ) show_right = false;
            }

            if( show_left ) {
                $( '.leftarrow', this.muestra.container ).show();
                $( '.leftarrow img', this.muestra.container ).bind( 'click', function(e) {
                    e.preventDefault();
                    backinner.fadeOut('slow').promise().done( function() {
                        backinner.remove();
                        self.CreateProductView( self.GetProductData(elements[data.position - 1].id) );
                    });
                });
            } else {
                $( '.leftarrow', this.muestra.container ).hide();
            }

            if( show_right ) {
                $( '.rightarrow', this.muestra.container ).show();
                $( '.rightarrow img', this.muestra.container ).bind( 'click', function(e) {
                    e.preventDefault();
                    backinner.fadeOut('slow').promise().done( function() {
                        backinner.remove();
                        self.CreateProductView( self.GetProductData(elements[data.position + 1].id) );
                    });
                });
            } else {
                $( '.rightarrow', this.muestra.container ).hide();
            }
        },

        GetProductData : function( id ) {
            var self = this;
            var prod = null;
            var pos  = null;

            $.each( $.parseJSON(self.args.data), function(i, item) {
                if( item.id == id ) {
                    pos                  = i;
                    prod                 = item;
                    prod.caracteristicas = item.caracteristicas;
                }
            });

            return { position : pos, product : prod };
        },

        AddToCart : function( id ) {
            var self = this;
            $.ajax({
                url  : 'ajax/carry.php',
                type : 'POST',
                data : { product_id : id, action : 'add' }
            }).done( function(response) {
                if( response == 1 ) console.log( 'agregado! :D' );
                else                console.log( 'ajax error :(' );
            }).fail( function() {
                console.log( 'todo recontra re mal =(' );
            });
        }
    };
} (jQuery) );

// presupuesto
( function($) {
    $.Brafh.Presupuesto = function() {
        this.buttons  = $('.productos .title');
        this.combo    = $('.combo');
        this.eliminar = $('.eliminar');
    };

    $.Brafh.Presupuesto.prototype = {
        Start : function() {
            var self = this;

            this.buttons.bind( 'click', function(e) {
                e.preventDefault();
                self.combo.slideToggle('swing').promise().done( function() {
                    var bkg = self.buttons.css('background-image');
                    if( bkg.match(/arrow_down\.jpg/) ) {
                        bkg = bkg.replace( 'arrow_down', 'arrow_up' );
                    } else {
                        bkg = bkg.replace( 'arrow_up', 'arrow_down' );
                    }
                    self.buttons.css({ 'background-image' : bkg });
                });
            });

            this.eliminar.bind( 'click', function(e) {
                e.preventDefault();
                self.EliminarProductos();
            });
        },

        SetProductos : function( data ) {
            var self = this;

            if( data.length == 0 ) {
                $( 'li', this.combo ).remove();
                this.combo.append('<li>No ha agregado productos al presupuesto</li>');
                this.combo.css({
                    'list-style' : 'none outside none'
                });
                $( 'li', this.combo ).css({
                    'white-space' : 'normal',
                    'text-align'  : 'center'
                });
            } else {
                $.each( data, function(i, item) {
                    var li = $('<li>' + item + '</li>').attr( 'title', item );
                    self.combo.append( li );
                });
            }
        },

        EliminarProductos : function() {
            var self = this;

            $.ajax({
                url  : 'ajax/carry.php',
                type : 'POST',
                data : { action : 'delete' }
            }).done( function(response) {
                if( response == 1 ) {
                    $( 'li', self.combo ).remove();
                    self.combo.append('<li>No ha agregado productos al presupuesto</li>');
                    self.combo.css({
                        'list-style' : 'none outside none'
                    });
                    $( 'li', self.combo ).css({
                        'white-space' : 'normal',
                        'text-align'  : 'center'
                    });
                }
                else console.log( 'todo mal :(' );
            }).fail( function() {
                console.log( 'todo reconnnnntra re mil mal mal mal =(' );
            });
        }
    };
} (jQuery) );

// formulario generico
( function($) {
    $.Brafh.Form = function( args ) {
        this.container = args.container;
        this.button    = args.button;
        this.fields    = args.fields;
    };

    $.Brafh.Form.prototype = {
        ClearErrors : function() {
            $.each( this.fields, function(i, item) {
                item.control.removeClass('error');
            });
        },

        AddError : function( e ) {
            e.control.addClass('error');
        },

        ShowSuccessMessage : function( args ) {
            alert( args.message );
        },

        ShowErrorMessage : function( args ) {
            alert( args.message );
        },

        ClearControls : function( args ) {
            $.each( this.fields, function(i, item) {
                item.control.ClearControl();
            });
        },

        Validate : function() {
            var errors = [];

            $.each( this.fields, function(i, item) {
                if( ! item.nullable ) {
                    switch( item.type ) {
                        case 'text'     : if( item.control.IsEmpty() ) errors.push( item ); break;
                        case 'select'   : if( ! item.control.IsValidSelection() ) errors.push( item ); break;
                        case 'paragraph': if( item.control.IsEmpty() ) errors.push( item ); break;
                    }
                }
            });

            return errors;
        }
    };
} (jQuery) );

// backend => clase principal
( function($) {
    $.Brafh.Backend = function() {
        this.form_nueva_linea    = new $.Brafh.Backend.FormNuevaLinea();
        this.form_nuevo_producto = new $.Brafh.Backend.FormNuevProducto();
        this.session             = new $.Brafh.Backend.Session();
    };

    $.Brafh.Backend.prototype = {
        Start : function() {
            this.form_nueva_linea.Start();
            this.form_nuevo_producto.Start();
            this.session.Start();
        }
    };
} (jQuery) );

// backend => formulario de nueva linea
( function($) {
    $.Brafh.Backend.FormNuevaLinea = function() {
        this.form = new $.Brafh.Form({
            container : $('#linea_nueva'),
            button    : $('span[name="linea_crear"]'),
            fields    : {
                nombre : { control : $('input[name="linea_nombre"]'), type : 'text', nullable : false }
            }
        });
    };

    $.Brafh.Backend.FormNuevaLinea.prototype = {
        Start : function() {
            var self = this;

            this.form.button.bind( 'click', function(e) {
                e.preventDefault();
                self.AgregarLinea();
            });
        },

        AgregarLinea : function() {
            var self = this;

            this.form.ClearErrors();
            var errors = this.form.Validate();
            if( errors.length > 0 ) {
                $.each( errors, function(i, item) {
                    self.form.AddError({ control : item.control });
                });
                return;
            }

            this.form.ClearErrors();
            var obj = {
                nombre : this.form.fields.nombre.control.val().trim()
            };

            $.ajax({
                url  : '../ajax/agregar_linea.php',
                type : 'POST',
                data : obj
            }).done( function(response) {
                console.log( response );
                if( response == 1 ) self.form.ShowSuccessMessage({ message : 'La nueva l\xEDnea ha sido creada exitosamente' });
                else                self.form.ShowErrorMessage({ message : 'Ha ocurrido un error inesperado mientras se creaba la nueva l\xEDnea' });
            }).fail( function() {
                self.form.ShowErrorMessage({ message : 'Ha ocurrido un error inesperado mientras se creaba la nueva l\xEDnea' });
            });
        }
    };
} (jQuery) );

// backend => formulario de nuevo producto
( function($) {
    $.Brafh.Backend.FormNuevProducto = function() {
        this.form = new $.Brafh.Form({
            container : $('#producto_nuevo'),
            button    : $('span[name="producto_crear"]'),
            fields    : {
                nombre          : { control : $('input[name="producto_nombre"]'),             type : 'text',   nullable : false },
                linea           : { control : $('select[name="producto_linea"]'),             type : 'select', nullable : false },
                tipo            : { control : $('select[name="producto_tipo"]'),              type : 'select', nullable : false },
                energia         : { control : $('input[name="producto_energia"]'),            type : 'text',   nullable : false },
                caracteristicas : { control : $('textarea[name="producto_caracteristicas"]'), type : 'text',   nullable : false }
            },
            ajax_data : null
        });
    };

    $.Brafh.Backend.FormNuevProducto.prototype = {
        Start : function() {
            var self = this;

            this.form.fields.linea.control.bind( 'change', function(e) {
                if( $(e.target).IsValidSelection() ) {
                    self.GetTiposProductos( $(':selected', e.target).val() );
                    self.PopulateTiposProductos( $.parseJSON(self.ajax_data) );
                    self.ajax_data = null;
                } else {
                    $( 'option', self.form.fields.tipo.control ).remove();
                }
            });

            this.form.button.bind( 'click', function(e) {
                e.preventDefault();
                self.AgregarProducto();
            });
        },

        GetTiposProductos : function( idl, output ) {
            var self = this;

            $.ajax({
                url  : '../ajax/get_tipos_productos.php',
                type : 'POST',
                data : { id_linea : idl },
                async: false
            }).done( function(response) {
                if( response != 0 ) self.ajax_data = response;
            }).fail( function() {
                self.form.ShowErrorMessage({ message : 'Ha ocurrido un error inesperado mientras se recuperaban los tipos de productos' });
            });
        },

        PopulateTiposProductos : function( items ) {
            var self = this;

            $( 'option', this.form.fields.tipo.control ).remove();
            var options = '<option value="seleccionar">Seleccionar...</option><option value="blanco">&nbsp;</option>';
            $.each( items, function(i, item) {
                options += '<option value="' + item.id + '">' + item.descripcion + '</option>'
            });
            $( this.form.fields.tipo.control ).append( $(options) );
        },

        AgregarProducto : function() {
            var self = this;

            this.form.ClearErrors();
            var errors = this.form.Validate();
            if( errors.length > 0 ) {
                $.each( errors, function(i, item) {
                    self.form.AddError({ control : item.control });
                });
                return;
            }

            this.form.ClearErrors();
            var obj = {
                nombre          : this.form.fields.nombre.control.val().trim(),
                tipo            : this.form.fields.tipo.control.val(),
                energia         : this.form.fields.energia.control.val(),
                caracteristicas : this.form.fields.caracteristicas.control.val()
            };

            $.ajax({
                url  : '../ajax/agregar_producto.php',
                type : 'POST',
                data : obj
            }).done( function(response) {
                if( response == 1 ) self.form.ShowSuccessMessage({ message : 'El nuevo producto ha sido agregado exitosamente' });
                else                self.form.ShowErrorMessage({ message : 'Ha ocurrido un error inesperado mientras se agregaba el nuevo producto' });
            }).fail( function() {
                self.form.ShowErrorMessage({ message : 'Ha ocurrido un error inesperado mientras se agregaba el nuevo producto' });
            });
        }
    };
} (jQuery) );

// sesion de usuario
( function($) {
    $.Brafh.Backend.Session = function() {
        this.form = new $.Brafh.Form({
            container : $('#login'),
            button    : $('span[name="login"]'),
            fields    : {
                id   : { control : $('input[name="id"]'),   type : 'text', nullable : false },
                pass : { control : $('input[name="pass"]'), type : 'text', nullable : false }
            }
        });
        this.logout_button = $('#logout');
    };

    $.Brafh.Backend.Session.prototype = {
        Start : function() {
            var self = this;

            this.form.button.bind( 'click', function() {
                self.Login();
            });

            this.form.fields.id.control.bind( 'keydown', function(e) {
                if( e.keyCode == 13 ) self.Login();
            });

            this.form.fields.pass.control.bind( 'keydown', function(e) {
                if( e.keyCode == 13 ) self.Login();
            });

            this.logout_button.bind( 'click', function() {
                self.Logout();
            });
        },

        Login : function() {
            var self = this;

            this.form.ClearErrors();
            var errors = this.form.Validate();
            if( errors.length > 0 ) {
                $.each( errors, function(i, item) {
                    self.form.AddError({ control : item.control });
                });
                return;
            }

            this.form.ClearErrors();
            var obj = {
                user_id   : this.form.fields.id.control.val().trim(),
                user_pass : this.form.fields.pass.control.val().trim(),
                action    : 'login'
            };

            $.ajax({
                url  : '../ajax/user_session.php',
                type : 'POST',
                data : obj
            }).done( function(response) {
                console.log( response );
                if( response == 0 ) {
                    alert('Nombre de usuario o contrase\xF1a inv\xE1lidos');
                    self.form.ClearControls();
                    self.form.fields.id.control.focus();
                }
                else if( response == 1 ) window.location = document.URL;
            }).fail( function() {
                alert('Se produjo un error inesperado al intentar validar el nombre de usuario y contrase\xF1a ingresados');
            });
        },

        Logout : function() {
            var obj = {
                action : 'logout'
            };

            $.ajax({
                url  : '../ajax/user_session.php',
                type : 'POST',
                data : obj
            }).done( function(response) {
                console.log( response );
                if( response == 0 )      alert('Se produjo un error al intentar cerrar su sesi\xF3n de usuario');
                else if( response == 1 ) window.location = document.URL;
            }).fail( function() {
                alert('Se produjo un error al intentar cerrar su sesi\xF3n de usuario');
            });
        }
    };
} (jQuery) );